home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / pump_src / rotblur.c < prev    next >
C/C++ Source or Header  |  1995-10-26  |  7KB  |  240 lines

  1.  
  2. #include "pump.h"
  3.  
  4. #include <math.h>
  5.  
  6. #define PI 3.141592687
  7.  
  8. PRIVATE byte (*BlurTable)[256] = NULL;
  9.  
  10. PRIVATE byte *b1, *b2;
  11.  
  12. void InitRotblur(void) {
  13.     int i, j;
  14.  
  15.     BlurTable = NEW(256*256);
  16.     if (BlurTable == NULL)
  17.         BASE_Abort("Alloc BlurTable");
  18.  
  19.     for (i = 0; i < 256; i++)
  20.         for (j = 0; j < 256; j++) {
  21. //            int c = (i*200+55*j)/256;
  22. //            int c = (i*255+0*j)/256;
  23. //            int c = (i*150+100*j)/256;
  24.             int c = (i*170+82*j)/256;
  25.             if (c > 63)
  26.                 c = 63;
  27.             BlurTable[i][j] = c;
  28.         }
  29. }
  30.  
  31. extern void RB_DoRaster(byte *dest, const byte *org, const byte (*table)[256],
  32.                         sint32 sx, sint32 sy);
  33. #pragma aux RB_DoRaster parm [EDI] [ESI] [EBX] [EDX] [ECX]
  34. extern sint32 RB_Dx, RB_Dy;
  35.  
  36. void DrawRotBlur(byte *dest, const byte *org, sint32 rad, word angle, word cang) {
  37.     sint32 x, y, dx, dy;
  38.     double c, s;
  39.     int i, j;
  40.  
  41. /*
  42.     dx = FPMult(rad, Cos(angle));
  43.     dy = FPMult(rad, Sin(angle));
  44. */
  45.     c = cos(angle*PI/32768.0);
  46.     dx =  (double)rad*c;
  47.     s = sin(angle*PI/32768.0);
  48.     dy = -(double)rad*s;
  49.     x = -160*dx/160 - (-100*dy/160);
  50.     y = -160*dy/160 - ( 100*dx/160);
  51.     c = cos(cang*PI/32768.0);
  52.     s = sin(cang*PI/32768.0);
  53.     x += c*rad/100;
  54.     y += s*rad/100;
  55.  
  56.     dx /= 160;
  57.     dy /= 160;
  58.  
  59.     RB_Dx = dx;
  60.     RB_Dy = dy;
  61.  
  62.     for (i = 0; i < 200; i++) {
  63. /*
  64.         sint32 sx = x;
  65.         sint32 sy = y;
  66.         for (j = 0; j < 320; j++) {
  67.             byte c = org[(sy >> 16)*512 + (sx >> 16)];
  68.             *dest = BlurTable[c][*dest];
  69.             dest++;
  70.             sx += dx;
  71.             sy += dy;
  72.         }
  73. */
  74.         RB_DoRaster(dest, org-256*512-256, BlurTable, x, y);
  75.         dest += 512;
  76.         x -= dy;
  77.         y += dx;
  78.     }
  79. }
  80.  
  81.  
  82. void DrawDot(byte *dest, int x, int y, int r) {
  83.     static byte Shape[10][10] = {
  84. /*
  85.         {  0,  0,  0,  5, 15, 15,  5,  0,  0,  0},
  86.         {  0,  5, 10, 15, 20, 20, 15, 10,  5,  0},
  87.         {  0, 10, 15, 25, 30, 30, 25, 15, 10,  0},
  88.         {  5, 15, 25, 35, 40, 40, 35, 25, 15,  5},
  89.         { 15, 20, 30, 40, 40, 40, 40, 30, 20, 15},
  90.  
  91.         { 15, 20, 30, 40, 40, 40, 40, 30, 20, 15},
  92.         {  5, 15, 25, 35, 40, 40, 35, 25, 15,  5},
  93.         {  0, 10, 15, 25, 30, 30, 25, 15, 10,  0},
  94.         {  0,  5, 10, 15, 20, 20, 15, 10,  5,  0},
  95.         {  0,  0,  0,  5, 15, 15,  5,  0,  0,  0},
  96. */
  97.         {  0,  0,  0,  5, 15, 15,  5,  0,  0,  0},
  98.         {  0,  5, 10, 15, 20, 20, 15, 10,  5,  0},
  99.         {  0, 10, 15, 25, 35, 35, 25, 15, 10,  0},
  100.         {  5, 15, 25, 40, 40, 40, 40, 25, 15,  5},
  101.         { 15, 20, 35, 40, 40, 40, 40, 35, 20, 15},
  102.  
  103.         { 15, 20, 35, 40, 40, 40, 40, 35, 20, 15},
  104.         {  5, 15, 25, 40, 40, 40, 40, 25, 15,  5},
  105.         {  0, 10, 15, 25, 35, 35, 25, 15, 10,  0},
  106.         {  0,  5, 10, 15, 20, 20, 15, 10,  5,  0},
  107.         {  0,  0,  0,  5, 15, 15,  5,  0,  0,  0},
  108.     };
  109.     int i, j;
  110.  
  111.     x += 256 - r/2;
  112.     y += 256 - r/2;
  113.     for (i = 0; i < 10; i++)
  114.         for (j = 0; j < 10; j++) {
  115.             byte c = dest[x+j + (y+i)*512] + Shape[i][j];
  116.             if (c > 63)
  117.                 c = 63;
  118.             dest[x+j + (y+i)*512] = c;
  119.         }
  120. }
  121.  
  122.  
  123. void UpdateBlur(sint32 rad, word rot, word cang) {
  124.     int i;
  125.     DrawRotBlur(b2 + (512-200)/2*512 + (512-320)/2,
  126.                 b1 + 512*256         + 256,
  127.                 rad, rot, cang);
  128.     for (i = 0; i < 200; i++)
  129.         RepMovsb(LLS_Screen[i], b2 + ((512-200)/2+i)*512 + (512-320)/2, 320);
  130.     {
  131.         byte *t; t = b1; b1 = b2; b2 = t;
  132.     }
  133. }
  134.  
  135. void DoRotblur(void) {
  136.     byte pal[768];
  137.     int i;
  138.     word a0, a1, a2, a3, a4;
  139.     dword t;
  140.     int state = 0;
  141.  
  142.     REQUIRE( (b1 = NEW(512*512)) != NULL);
  143.     REQUIRE( (b2 = NEW(512*512)) != NULL);
  144.     MemSetD(b1, 0, 512*512);
  145.     MemSetD(b2, 0, 512*512);
  146.     MemSetD((void *)0xA0000, 0, 64000);
  147.  
  148.     for (i = 0; !LLK_SpacePressed && i < 4; i++) {
  149.         while (!LLK_SpacePressed && !DVTInfo->semaphores[5]);
  150.         DVTInfo->semaphores[5]--;
  151.         memset(pal, 63, 768);
  152.         VBL_DumpPalette(pal, 0, 256);
  153.         VBL_DestPal = NULL;
  154.         VBL_DestRed = VBL_DestBlue = VBL_DestGreen = 0;
  155.         VBL_FadeMode = VBL_FADEFAST;
  156.         VBL_FadeStartColor = 0;
  157.         VBL_FadeNColors = 64;
  158.         VBL_FadePos = 1;
  159.         VBL_FadeSpeed = 4;
  160.     }
  161.  
  162.     for (i = 0; i < 64; i++) {
  163.         pal[i*3+0] = 63;
  164.         pal[i*3+1] = 63;
  165.         pal[i*3+2] =  0;
  166.     }
  167.     LLS_SetMode(LLSM_DIRECT, LLSVM_MODE13);
  168.     VBL_DumpPalette(pal, 0, 256);
  169.  
  170.     for (i = 0; i < 64; i++) {
  171.         pal[i*3+0] = i;
  172.         pal[i*3+1] = 10 + i*(64-10)/64;
  173.         pal[i*3+2] =  5 + i*(64- 5)/64;
  174.     }
  175.  
  176.     VBL_DestPal = pal;
  177.     VBL_FadeMode = VBL_FADEFAST;
  178.     VBL_FadeStartColor = 0;
  179.     VBL_FadeNColors = 64;
  180.     VBL_FadePos = 1;
  181.     VBL_FadeSpeed = 1;
  182.  
  183.     state = 0;
  184.     a0 = a1 = a2 = a3 = a4 = 0;
  185.     VBL_VSync(0);
  186.     t = 0;
  187.     while (!LLK_SpacePressed && t < 20*70) {
  188.         int nf;
  189.         switch(state) {
  190.             case 0:
  191.                 for (i = 0; i < 10; i++)
  192.                     DrawDot(b1, rand()%160 - 80, rand()%100 - 50, 10);
  193.                 if (t > 7*70)
  194.                     state = 1;
  195.                 break;
  196.             case 1: {
  197.                 sint32 cx, cy;
  198.  
  199.                 cx = FPMult(55, Cos(a3)) + FPMult(55, Cos(a2));
  200.                 cy = FPMult(20, Sin(a3)) + FPMult(20, Sin(a2));
  201.                 //for (i = -5; i < 5; i++)
  202.                 //    DrawDot(b1, cx + FPMult(9*i, Sin(a2)), cy + FPMult(9*i, Cos(a2)), 10);
  203.                 for (i = 0; i < 0x00010000UL; i += 0x1000)
  204.                     DrawDot(b1, cx + FPMult(FPMult(50,Cos(i)), Sin(a4)), cy + FPMult(FPMult(Sin(i), 50), Cos(a4)), 10);
  205.                 if (t > 19*70+7) {
  206.                     state = 2;
  207.                     VBL_DestPal = NULL;
  208.                     VBL_DestRed = VBL_DestBlue = VBL_DestGreen = 0;
  209.                     VBL_FadeMode = VBL_FADEFAST;
  210.                     VBL_FadeStartColor = 0;
  211.                     VBL_FadeNColors = 256;
  212.                     VBL_FadePos = 1;
  213.                     VBL_FadeSpeed = 1;
  214.                 }
  215.                 break;
  216.             }
  217.             case 2:
  218. /*
  219.                 for (i = 1; i < 11; i++)
  220.                     DrawDot(b1, FPMult(9*i, Cos(a2+4000*i)), FPMult(6*i, Sin(a2+4000*i)), 10);
  221. */
  222.                 break;
  223.         }
  224.         UpdateBlur((154 << 16) + FPMult(2 << 16, Sin(a0)),
  225.                     FPMult(600, Sin(a1)), a2);
  226.         nf = VBL_VSync(1);
  227.         a0 += 150*nf;
  228.         a1 += 100*nf;
  229.         a2 += 257*nf;
  230.         a3 += 203*nf;
  231.         a4 += 500*nf;
  232.         t += nf;
  233.     }
  234.  
  235.     LLS_SetMode(LLSM_VIRTUAL, LLSVM_MODE13);
  236.     DISPOSE(b1);
  237.     DISPOSE(b2);
  238.     DISPOSE(BlurTable);
  239. }
  240.